English version

logo Keyclic

Documentation du service Keyclic

Keyclic est une application de remontée et de traitement de demandes. Elle permet à ses utilisateurs de signaler des dysfonctionnements, des problèmes techniques ou tout autre type d’information, et de remonter ces signalements aux organisations concernées.

Sommaire

Aperçu

Fonctionnement général

L’application Keyclic est librement ouverte aux inscriptions. Une fois inscrit, tout utilisateur peut créer des demandes. Une demande est toujours liée à une zone de responsabilité et comporte éventuellement une position géographique et des données complémentaires photos, description, métadonnées, etc.

Certains utilisateurs peuvent également être regroupés au sein d’organisations. Une organisation est donc un groupe d’utilisateurs membres de la même entreprise, association, corporation, école, etc. Tout utilisateur est libre de créer sa propre organisation et d’inviter d’autres utilisateurs à en devenir membres.

Les administrateurs définissent des zones de responsabilité sur lesquelles leur organisation peut intervenir, des catégories d’intervention (exemple : plomberie, peinture, climatisation), un cycle de vie de la demande (exemple : Nouveau, En cours, Terminé) et un ensemble de paramètres concernant la confidentialité des demandes reçues.

Ainsi, quand un utilisateur crée une demande, la zone de responsabilité de cette demande permet de lui proposer les catégories et de le laisser choisir celle qui lui semble la plus adaptée. Aussi, quand un utilisateur crée une demande, suivant les paramètres de confidentialité de l’organisation, celui-ci peut avoir le choix de la rendre publique ou privée. Si publique, la demande est visible par la communauté : ainsi, les autres utilisateurs peuvent la commenter et/ou la soutenir (Voir la page Confidentialité des demandes).

La demande envoyée :

  • elle est transmise à l’organisation concernée, si les paramètres de confidentialité de cette organisation autorise l’utlisateur,
  • elle n’est pas transmise à l’organisation concernée, si les paramètres de confidentialité de cette organisation n’autorise pas l’utlisateur.

Un administrateur a donc accès à l’ensemble des demandes concernant son organisation. Pour chaque demande, il peut créer une ou plusieurs interventions, et affecter ces interventions aux membres de son organisation. Une autre possibilité est de déléguer cette demande à une organisation partenaire, le partenaire aura alors la charge de créer des interventions. Une fois que toutes les interventions ont été accomplies, il pourra considérer que le traitement est terminé et clôturer la demande.

Vocabulaire

Demande

Remarque effectuée sur le terrain par un utilisateur, pouvant porter sur un dysfonctionnement, un problème technique, une nuisance, etc. Toute demande est forcément faite en une position géographique donnée. Elle peut éventuellement comporter des photos, et être commentée et/ou soutenue par les autres utilisateurs.

Terme technique : feedback.

Voir la page Demandes.

Demande (organisation)

Toute demande peut entraîner la génération d’une demande à une organisation. Une demande reprend donc toutes les informations de la demande dont elle est issu, et n’est visible et manipulable que par l’organisation concernée. C’est sur cette demande que l’organisation travaille : création d’interventions, suivi, délégation, etc.

Terme technique : report.

Voir la page Rapports

Organisation

Groupe d’utilisateurs pouvant être une entreprise, une école, une association, un groupe de personnel d’un site, d’un chantier, etc.

Terme technique : organization.

Voir la page Organisations.

Zone de responsabilité

Aire géographique sur laquelle une organisation peut intervenir.

Terme technique : place.

Voir la section Gestion des zones de responsabilité.

Catégorie

Secteur d’activité d’une organisation.

Terme technique : category.

Voir la section Gestion des catégories.

Soutien

Une demande peut être soutenue par les utilisateurs de la communauté, afin de leur donner plus de poids.

Terme technique : contribution.

Voir la section Soutiens.

Intervention

Une intervention est une tâche créée par un administrateur sur une demande donnée. Cette tâche est assignée à un membre de l’organisation. Un rapport ne peut être clôturé que si toutes les interventions qui lui sont liées ont été accomplies (ou refusées).

Terme technique : operation.

Voir la section Interventions.

Partenaires

Un administrateur peut définir des organisations partenaires, qui sont d’autres organisations auxquelles il pourra déléguer des demandes.

Terme technique : relationship.

Voir la section Gestion des partenariats.

Considérations techniques

L’API Keyclic est une API REST. Toutes les opérations sont effectuées via le protocole https et sécurisées par JSON Web Tokens. Les données sont échangées exclusivement au format JSON.

Le nom de domaine de l’API Keyclic est :

api.keyclic.com

Applications et clés d’applications

Tout client de l’API doit transmettre dans les headers de chaque requête une clé définissant l’application sur laquelle il travaille.

Si vous développez un client pour travailler sur une application existante de Keyclic, vous devez connaître la clé de cette application. Si au contraire vous développez un client pour une nouvelle application, merci de vous adresser à la société Keyclic pour que celle-ci crée l’application et sa configuration et vous fournisse la clé correspondante.

Exemples de clés d’applications :

  • com.keyclic.app
  • com.keyclic.city
  • com.keyclic.highway

Chaque requête doit donc préciser, dans ses headers, la valeur du paramètre X-Keyclic-App. Voir ci-dessous le paragraphe Requêtes pour la mise en œuvre.

Notez cependant que la base utilisateurs est commune à toutes les applications Keyclic. De fait, les endpoints d’inscription et de connexion (voir : Authentification et connexion) font exception à la règle ci-dessus : ces deux endpoints n’exigent pas qu’une clé d’application leur soit fournie.

Requêtes

Dans cette documentation, chaque endpoint de l’API sera décrit par le chemin d’accès à la ressource précédé du verbe HTTP.

Exemple :

GET /feedbacks

Le endpoint ci-dessus retourne toutes les demandes. Son URL véritable est

https://api.keyclic.com/feedbacks

mais pour des raisons de concision, dans cette documentation, nous ne préciserons jamais le protocole ni le nom de domaine.

Paramètres d’URL

Dans cette documentation, les variables d’URI (exemples : identifiant d’une ressource, numéro de page, etc) seront exprimés entre accolades. Par exemple, pour récupérer une demande (feedback) donnée :

GET /feedbacks/{feedback}

Dans l’API Keyclic, conformément aux principes d’architecture REST, les paramètres de filtrage sont toujours passés en « query string ». Exemple :

GET /feedbacks?page={page}

Par ailleurs, pour une meilleure lisibilité, les paramètres d’URI seront écrits tels quels dans cette documentation, et non sous leur forme URL encodée :

GET /feedbacks?before=2018-04-22T01:00:00+05:00
Headers

En plus des headers conventionnels de HTTP/1.1, l’API Keyclic accepte, et même exige dans la plupart des cas, le header X-Keyclic-App, correspondant à l’application utilisée (voir ci-dessus : Applications et clés d’applications). Par exemple, pour récupérer toutes les demandes sur l’application com.keyclic.app, la requête comportera le header :

X-Keyclic-App : com.keyclic.app

Tous les endpoints exigent que ce header soit fourni, à l’exception des endpoints de login et de changement de mot de passe. (voir : Authentification et connexion)

Toutes les requêtes (à l’exception du login, du register et du changement de mot de passe) doivent aussi comporter le header Authorization afin d’authentifier l’utilisateur. (voir : Authentification et connexion)

Format des requêtes et réponses

Le seul type de contenu accepté par l’API Keyclic est JSON. Vos requêtes devront donc comporter le header :

Content-type: application/json

et le corps des requêtes devra toujours être formaté en JSON. Les réponses sont également toujours retournées au format JSON.

Envoi de fichiers

Tous les fichiers sont envoyés en base 64 à l’API. Voici par exemple l’ajout d’une image représentant un carré rouge d’1 pixel sur 1 sur une demande :

POST /feedbacks/{feedback}/images
{
    "image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QIVDRUfvq7u+AAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAUSURBVAjXY3wrIcGABJgYUAGpfABZiwEnbOeFrwAAAABJRU5ErkJggg=="
}

Modification de ressources

Dans l’API Keyclic, la modification des ressources s’effectue avec la méthode PATCH. Contrairement à la méthode PUT, la méthode PATCH permet de modifier une seule propriété ou une partie seulement des propriétés d’une ressource, sans qu’il soit nécessaire d’en envoyer une représentation complète. Le format utilisé pour la description du patch est JSON Patch.

À titre d’exemple, voici la modification de la propriété billingEmailAddress d’une organisation :

PATCH /organizations/{organization}
{
    "billingEmailAddress":"test@test.com"
}

Retours d’erreurs

Toute erreur entraîne une réponse de code 4xx reflétant le type d’erreur.

Quand il s’agit d’une erreur de type 400 (Bad Request), les raisons de l’erreur sont retournées.

Les erreurs sont décrites au format vdn.error.

L’exemple suivant montre un retour d’erreur de validation. Le champ path indique la propriété sur laquelle porte l’erreur (ici : reporter), et le champ message indique la nature de l’erreur.

{
    "@context": "https://github.com/blongden/vnd.error",
    "@type": "ValidationError",
    "message": "Validation failed.",
    "total": 1,
    "_embedded": {
        "errors": [
            {
                "@context": "https://github.com/blongden/vnd.error",
                "@type": "Error",
                "message": "Cette valeur ne doit pas \u00eatre vide.",
                "path": "reporter"
            }
        ]
    }
}

Changements de statut

Plusieurs ressources manipulées par l’API ont un cycle de vie et possèdent un certain statut à un instant donné. C’est le cas des demandes et des interventions.

Pour ces ressources, l’état est toujours indiqué dans la réponse avec le paramètre state, et les actions possibles pour faire évoluer ce statut sont toujours indiquées sous le paramètre stateTransitions. Exemple :

GET reports/{report}

Réponse (partielle) :

{
    "type": "Report",
    "id": "cb7118b5-a821-4cf2-9475-0c0d0efdb8d0",
    "state": "NEW",
    "_embedded": {
        "stateTransitions": [
            "accept",
            "refuse"
        ]
    }
}

Dans l’exemple ci-dessus, la demande est en statut NEW et les actions possibles sur son statut sont accept et refuse.

Tout changement de statut est effectué avec la méthode POST en passant le nom de la transition dans le body.

Par exemple, pour accepter la demande ci-dessus :

POST /reports/{report}/workflow/transition
{
    "transition": "accept"
}

La réponse nous informe que la demande possède désormais le statut ACCEPTED, et que les actions possibles sont désormais refuse, hold et progress :

{
    "type": "Report",
    "id": "32219286-528a-4f97-b81e-fe7a8cb85707",
    "state": "ACCEPTED",
    "_embedded": {
        "stateTransitions": [
            "refuse",
            "hold",
            "progress"
        ]
    }
}

Les actions et status possibles pour chaque type de ressources sont décrits dans les sections idoines de cette documentation.

Authentification et connexion

L’API Keyclic se base sur le standard JSON Web Tokens pour la sécurisation de l’échange des données. Toute requête à l’API est nécessairement effectuée en fournissant un jeton d’accès (accessToken) permettant au serveur de vérifier l’identité de l’utilisateur. Un endpoint permet à l’utilisateur d’obtenir ce jeton d’accès en fournissant son login et son mot de passe. Cette section détaille la création d’un compte, l’obtention et l’utilisation d’un accessToken, et la modification d’un compte utilisateur.

Pour plus d’informations sur le standard JWT, voir : le site officiel de JSON Web Tokens.

Création d’un compte utilisateur

Un nouveau compte utilisateur est créé avec la requête :

POST /security/register
{
    "email":"test@test.com",
    "password":"test"
}

Le nouvel utilisateur se voit attribuer un identifiant unique et le rôle ROLE_USER, lui permettant d’utiliser les fonctionnalités de base de l’API.

Connexion

La connexion consiste à envoyer ses credentials au serveur afin d’obtenir en retour un accessToken qui sera utilisé pour les requêtes ultérieures.

La connexion s’effectue avec la requête :

POST /security/login
{
    "login":"test@test.com",
    "password":"test"
}

Si les credentials sont reconnus par le serveur, celui-ci retourne un accessToken qui sera utilisé par l’utilisateur pour ses futures requêtes.

Utilisation du token

La quasi-totalité des requêtes à l’API nécessitent que l’utilisateur soit authentifié, c’est-à-dire qu’il fournisse son accessToken. Le token est envoyé dans l’en-tête Authorization de la requête, préfixé par Bearer.

Par exemple, pour récupérer la liste des feedbacks de l’application com.keyclic.app, un utilisateur utilise le endpoint :

GET /feedbacks
Request headers :
    X-Keyclic-App : com.keyclic.app
    Authorization : Bearer eyJhbGciOiJSUzI1NiJ9.eyJyb2xlcyI6WyJPUkdBTklaQVRJT046QURNSU4iLCJST0xFX1VTRVIiXSwidXNlcm5hbWUiOiJ0ZXN0MjJAdGVzdC5jb20iLCJpcCI6Ijc3LjIwMy40NS40NCIsImV4cCI6MTQ4OTI0MTQ0NCwiaWF0IjoxNDg5MTU1MDQ0fQ.ZIqbBVSgJaXKj73IPYbFeEfie6FUIflv-ausUO-AAzVjPg8-jdhFv3nqsdOVJvE_AB4bXjME1CRVFI7xD2SYCA8V6E6H2-y0XZE8SN_XTpHGMxDvOP27C2VUNQfPwgeWxjXzlDopo_U9ybAEX4QdFhW14aeRgb9YWMDlzSD6VLgJO-LuprxX668Ajq5X9c8YND4D_p4WRDSQr8pqb3rTY9NQ6O34F-OpDJlAUYj0pwMehYWpywVKJHRMv9xCRRoI8HrU6H3J3wo-K2OtQVJi9XFZ8g8sohw_ZaasG7dohxrO-NtYSrOPXIXPI6kCDRuMi7sce06wfno1bC3jBoc83EhiBSBpDbWL98DSjPbF1SaCeE05aATfM5cMEXbnp8Iwh-QLxglE4M-ZISJ8VooxzJxa7cWLlFW-iu0XWVFWrMbYgmSoU0PKRQB47w_IOPxjWzDeMUTSA3esDwkxsYlNdS9SZe201EvI6zur5Ayot0PEGfAgex6Ew-eKOHAfnuDiqeLQLbWs4Y69FO2DooWUhkfVGdl-IGglDPgk2AOs3w19e7mx-Gmm8DlUUr-bK61NPPQ8dy7HPjXnU63-jbA17MAjHaRTO4eKopcZMWbpL-jgQjJltV3R5_0qNODaHCS_auZs2cyqFN0HL9Rred5g7t6Fxyk-8MyyX0GiTyHsp3c

Toutes les requêtes à l’API Keyclic nécessitent l’envoi d’un accessToken dans les headers, à l’exception évidente des endpoints suivants :

  • création d’un compte (POST /security/register)
  • login (POST /security/login)
  • demande de changement de mot de passe (POST /security/password/change-request)
  • changement de mot de passe (POST /security/password/change/{changePasswordToken})

Modification du mot de passe

Un utilisateur qui souhaite modifier son mot de passe procède en deux étapes.

Il effectue d’abord une demande de changement de mot passe :

POST /security/password/change-request
{
    "email":"test@test.com"
}

Cette requête envoie un email à l’utilisateur contenant un lien se terminant par un token de vérification. Exemple de lien :

https://domain.com/#/password-reset/jrtVqBLxxoSA0c2hpsOBN-JQGQHGN3YXsKPMG1PWWWA

Dans le lien ci-dessus, jrtVqBLxxoSA0c2hpsOBN-JQGQHGN3YXsKPMG1PWWWA est le jeton de changement de mot de passe. La portion d’URL https://domain.com/#/password-reset/ dépend de la configuration de l’application.

L’utilisateur peut ensuite changer son mot de passe avec :

POST /security/password/change/jrtVqBLxxoSA0c2hpsOBN-JQGQHGN3YXsKPMG1PWWWA
{
    "password":"password"
}

Modification des données utilisateur

Pour les données autres que le mot de passe, l’utilisateur enverra une requête sur le endpoint :

PATCH /people/{user}

Pour plus d’informations sur les requêtes PATCH, voir la section Modification de ressources.

Par exemple, pour modifier son nom :

{
    "familyName": "Nom de famille"
}

Les champs qu’un utilisateur peut modifier sont : son nom (familyName), son prénom (givenName), sa photo (image), son travail (job), son adresse email (email).

Membres d’organisation et rôles

Quand un utilisateur est collaborateur d’une organisation, il peut bénéficier d’aucun, d’un ou plusieurs rôles définissant un ensemble de permissions et de possibilités d’actions. Ces rôles peuvent être cumulés pour un même utilisateur et sont au nombre de cinq :

  • Administrateur
  • Agent
  • Intervenant
  • Statistiques
  • Export

Un utilisateur pouvant être membre de plusieurs organisations, les rôles qu’il possède sont indépendants et peuvent être différents d’une organisation à une autre. Tout utilisateur nouvellement attaché à une organisation devient « Collaborateur d’organisation ». Un « Collaborateur d’organisation » possède les mêmes droits qu’un utilisateur de base sans attachement à une organisation.

Administrateur

Tout utilisateur a la possibilité de créer une nouvelle organisation.

L’utilisateur qui crée une nouvelle organisation en devient automatiquement collaborateur et administrateur, c’est-à-dire qu’il se voit attribuer le rôle « Administrateur ».

Il obtient les permissions et droits suivants :

  • Ajouter de nouveaux collaborateurs à son organisation
  • Modifier les rôles des collaborateurs
  • Gérer les catégories de son organisation
  • Gérer les zones de responsabilité de son organisation
  • Gérer les partenaires de son organisation
  • Consulter et gérer les demanes reçues et les interventions liées à ces demandes

Voir : Organisations

Voir : Rapports

Note : Un utilisateur peut être « ORGANIZATION:ADMIN » de plusieurs organisations et une organisation peut avoir plusieurs « ORGANIZATION:ADMIN ».

Intervenant

Un « Collaborateur d’organisation » possédant ce rôle peut  :

  • Recevoir une assignation à une intervention
  • Éditer une intervention (changement des libellés, ajout de photos de constatation, etc)
  • Changer le statut d’une intervention

Note : Un utilisateur peut être « ORGANIZATION:OPERATOR » de plusieurs organisations et une organisation peut avoir plusieurs « ORGANIZATION:OPERATOR ».

Analyste

Le rôle « Analyste » permet d’accéder aux statistiques d’une organisation.

Note : Un utilisateur peut avoir le rôle « ORGANIZATION:ANALYTICS » pour plusieurs organisations et une organisation peut avoir plusieurs utilisateurs avec le rôle « ORGANIZATION:ANALYTICS ».

Export

Le rôle « Export » permet d’accéder aux fonctionnalités d’exportation Excel des demandes qu’a reçu une organisation.

Note : Un utilisateur peut avoir le rôle « ORGANIZATION:EXPORT » pour plusieurs organisations et une organisation peut avoir plusieurs utilisateurs avec le rôle « ORGANIZATION:EXPORT ».

Récupération des utilisateurs

Pour récupérer l’ensemble des utilisateurs de l’application :

GET /people

Pour récupérer un utilisateur :

GET /people/{user}

Pour rechercher les utilisateurs dont l’adresse email match un mot donné :

GET /people?search[email]=martin

Exemple de récupération des rôles d’un utilisateur

La lecture d’une ressource utilisateur permet de découvrir si la personne appartient à une organisation et quel(s) rôle(s) il y tient.

GET /people/5020c6ea-ca07-42d1-994f-d90b86703b1a/memberships
{
    "page": 1,
    "limit": 10,
    "pages": 1,
    "total": 1,
    "_links": {
        "self": {
            "href": "/people/5020c6ea-ca07-42d1-994f-d90b86703b1a/memberships?page=1&limit=10"
        },
        "first": {
            "href": "/people/5020c6ea-ca07-42d1-994f-d90b86703b1a/memberships?page=1&limit=10"
        },
        "last": {
            "href": "/people/5020c6ea-ca07-42d1-994f-d90b86703b1a/memberships?page=1&limit=10"
        }
    },
    "_embedded": {
        "items": [
            {
                "id": "b0e7e28f-5b91-4c73-875e-8f34aa03553a",
                "roles": [
                    "ORGANIZATION:ADMIN",
                    "ORGANIZATION:AGENT"
                ],
                "createdAt": "2018-02-27T10:00:00+02:00",
                "_links": {
                    "self": {
                        "href": "/organizations/84d36093-b8bc-47ad-bc8a-a043b3e301a9/members/b0e7e28f-5b91-4c73-875e-8f34aa03553a",
                        "iriTemplate": {
                            "mapping": {
                                "organization": "84d36093-b8bc-47ad-bc8a-a043b3e301a9",
                                "member": "b0e7e28f-5b91-4c73-875e-8f34aa03553a"
                            }
                        }
                    },
                    "person": {
                        "href": "/people/5020c6ea-ca07-42d1-994f-d90b86703b1a",
                        "iriTemplate": {
                            "mapping": {
                                "person": "5020c6ea-ca07-42d1-994f-d90b86703b1a"
                            }
                        }
                    },
                    "organization": {
                        "href": "/organizations/84d36093-b8bc-47ad-bc8a-a043b3e301a9",
                        "iriTemplate": {
                            "mapping": {
                                "organization": "84d36093-b8bc-47ad-bc8a-a043b3e301a9"
                            }
                        }
                    }
                },
                "_embedded": {
                    "availableRoles": [
                        "ORGANIZATION:ADMIN",
                        "ORGANIZATION:ANALYTICS",
                        "ORGANIZATION:EXPORT",
                        "ORGANIZATION:READ_ONLY"
                    ]
                }
            }
        ]
    }
}

Ce retour indique que l’utilisateur :

  • Est membre de l’organisation 84d36093-b8bc-47ad-bc8a-a043b3e301a9
  • Possède le rôle ORGANIZATION:ADMIN, il est donc administrateur de l’organisation 84d36093-b8bc-47ad-bc8a-a043b3e301a9
  • Possède le rôle ORGANIZATION:AGENT, il est donc agent de l’organisation 84d36093-b8bc-47ad-bc8a-a043b3e301a9
  • Est affilié avec une seule organisation
  • A rejoint l’organisation le 27 février 2018.

Aussi, un membre possède deux id différents, un id membre et un id utilisateur. Ainsi, dans le retour précédent on voit que son id utilisateur (5020c6ea-ca07-42d1-994f-d90b86703b1a) est différent de son id membre (b0e7e28f-5b91-4c73-875e-8f34aa03553a). L’API distingue les actions effectuées en tant que membre et celles effectuées en tant qu’utilisateur simple.

Organisations

Dans l’application Keyclic, une organisation est une entité telle que corporation, entreprise, département d’entreprise, association, école, institution, etc à laquelle peuvent être rattachées les demandes faites par les utilisateurs.

Un ou plusieurs membres d’une organisation peuvent en être les Administrateur. Une organisation possède au minimum un administrateur.

Les Administrateur peuvent définir les champs d’intervention de leur organisation en créant des catégories (exemple : voirie, transports, etc) et des zones de responsabilité.

L’utilisateur a alors accès à des informations lui permettant de l’aiguiller vers l’organisation la plus adéquate.

Création d’une organisation

Tout utilisateur peut créer une nouvelle organisation :

POST /organizations
{
    "name":"Nom de l'organisation",
    "billingEmailAddress":"test@test.com",
    "notificationEmailAddress":"test@test.com"
}

L’utilisateur devient automatiquement membre et administrateur de cette nouvelle organisation.

Pour récupérer toutes les organisations de l’application :

GET /organizations

Il est possible de filtrer la requête ci-dessus sur un point géographique (voir ci-dessous : Gestion des zones de responsabilité) :

GET /organizations?geo_coordinates=+44.851404209987386-0.5762618780136108

Gestion des membres

Pour ajouter un nouveau membre à une organisation :

POST /organizations/{organization}/members
{
    "person":"63d07fc5-f4e6-471c-a8cc-3c3f227c8c2d"
}

Ce endpoint est réservé à un utilisateur possédant le rôle Administrateur et membre de l’organisation {organization}.

Pour récupérer les membres d’une organisation :

GET /organizations/{organization}/members

Pour retirer un membre d’une organisation, un Administrateur de cette organisation exécutera la requête :

DELETE /organizations/{organization}/members/{member}

Gestion des zones de responsabilité

Un Administrateur peut créer des zones de responsabilité, correspondant aux lieux sur lesquels cette organisation intervient :

POST /organizations/{organization}/places
{
    "name": "Test",
    "polygon":
    {
        "rings":
        [
            {
                "points":
                [
                    {
                        "longitude": 2.373991012573242,
                        "latitude": 48.84088179130599
                    },
                    {
                        "longitude": 2.3763084411621094,
                        "latitude": 48.84205393836751
                    },
                    {
                        "longitude": 2.376694679260254,
                        "latitude": 48.84189859515306
                    },
                    {
                        "longitude": 2.3787975311279297,
                        "latitude": 48.84041574931067
                    },
                    {
                        "longitude": 2.376115322113037,
                        "latitude": 48.839031720249054
                    },
                    {
                        "longitude": 2.373991012573242,
                        "latitude": 48.84088179130599
                    }
                ]
            }
        ],
        "srid": 4326
    }
}

Pour récupérer toutes les zones de responsabilité de l’application :

GET /places

La requête ci-dessus peut-être filtrée sur une organisation donnée et/ou sur un point géographique donné :

GET /places?geo_coordinates=+44.851404209987386-0.5762618780136108&organization={organization}

Gestion des catégories

Les catégories sont les secteurs d’activité d’une organisation. Un Administrateur peut créer une nouvelle catégorie en lui donnant un nom, une couleur et une icône. L’icône sera choisie dans le jeu d’icônes de Font Awesome.

POST /organizations/{organization}/categories
{
    "name":"Nom de la catégorie",
    "color":"#ff0000",
    "icon":"fa-bug"
}

Les 3 propriétés name, color et icon peuvent être éditées par une requête PATCH (voir : Modification de ressources).

Pour récupérer l’ensemble des catégories de l’application :

GET /categories

La requête ci-dessus peut-être filtrée sur une organisation donnée et/ou sur un point géographique donné :

GET /categories?geo_coordinates=+44.851404209987386-0.5762618780136108&organization={organization}

Gestion des partenariats

Une organisation peut avoir des partenaires, c’est-à-dire des organisations qui lui sont rattachées et à qui l”Administrateur de l’organisation pourra déléguer des demandes. La relation de partenariat est unilatérale : si une organisation A est partenaire d’une organisation B, B n’est pas forcément partenaire de A.

Pour ajouter un nouveau partenaire à l’organisation, un administrateur de l’organisation requêtera sur le endpoint :

POST /organizations/{organization}/relationships
{
    "organization":"84d36093-b8bc-47ad-bc8a-a043b3e301a9"
}

Pour récupérer les partenaires d’une organisation :

GET /organizations/{organization}/relationships

Cette requête ne peut être exécutée que par un administrateur de l’organisation.

Demandes

Une demande est toujours faite en une zone de responsabilité donnée. Cette zone de responsabilité peut être renseignée directement ou peut être déterminée grâce à une position géographique. Si les 2 sont spécifiés alors la position géographique permettra de préciser le lieu (par exemple : au sein d’une grande zone de responsabilité).

Les paramètres optionnels étant la description, la catégorie, une ou plusieurs photos et des métadonnées.

Tous les utilisateurs peuvent créer des demandes.

Création d’une demande

POST /feedbacks/issues

Exemple du minimum requis pour effectuer une demande, une demande est créée sans catégorie et sans description. L’utilisateur émettant cette demande est détecté automatiquement grâce à l’authentification.

{
    "businessActivity": "4bff7cb9-0fd2-4b44-9b0e-f6d17bb4ef36",
    "geo": {
        "elevation": 1,
        "point": {
            "latitude": 44.851343361295214,
            "longitude": -0.5763262510299683
        }
    }
}

Exemple plus complet, une catégorie et une description sont précisées :

{
    "businessActivity": "4bff7cb9-0fd2-4b44-9b0e-f6d17bb4ef36",
    "category": "b0d007d5-e6ad-4113-b2b5-d8a1858a2fb1",
    "description": "Mon feedback 5",
    "geo": {
        "elevation":1,
        "point": {
            "latitude":44.851343361295214,
            "longitude":-0.5763262510299683
        }
    },
    "visibility": "VISIBILITY_PUBLIC"
}

La visibilité de la demande est par défaut VISIBILITY_PRIVATE si celle-ci n’est pas renseignée.

L’utilisateur peut ensuite ajouter une ou plusieurs images à sa demande :

POST /feedbacks/{feedback}/images
{
    "image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QIVDRUfvq7u+AAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAUSURBVAjXY3wrIcGABJgYUAGpfABZiwEnbOeFrwAAAABJRU5ErkJggg=="
}

Pour plus d’informations sur l’envoi d’images, voir Envoi de fichiers.

Rattachement d’une demande à une organisation

Le service Keyclic ne se contente pas de recueillir des demandes : elle sont transmises aux organisations concernées, qui en assureront le traitement. Pour cela, trois cas de figure peuvent se présenter :

  • Si la position géographique de la demande ne correspond à aucune zone de responsabilité, alors aucune organisation ne recevra cette demande.
  • Si la position géographique de la demande se trouve dans une zone de responsabilité définie par une organisation, la demande est automatiquement remonté à l’organisation en question.
  • Si la position géographique de la demande se trouve sur deux (ou plus) zones de responsabilité appartenant à deux (ou plus) organisations différentes, mais que l’utilisateur n’a pas précisé de secteur d’activité particulier, alors plusieurs demandes sont générées et remontées à toutes les organisations concernées. La première organisation qui acceptera la demande pourra en effectuer le traitement.

Demande postée par un collaborateur

Les members-collaborator peuvent poster des demandes de la même façon que tous les utilisateurs. Cependant si la demande est réalisée par un collaborateur celle-ci pourra être traitée différemment :

  • Si sa demande est positionnée dans une zone de responsabilité régie par son organisation, la demande créée qui en découle est automatiquement acceptée.
  • Si sa demande n’est pas positionnée dans une zone de responsabilité régie par son organisation, alors sa demande n’est pas automatiquement acceptée.

Résumé du cycle de vie d’une demande

_images/feedback_workflow.png

Récupération des demandes

Pour récupérer les demandes :

GET /feedbacks

Cette requête retourne uniquement les demandes dont le statut est DELIVERED.

Plusieurs critères permettent de filtrer les demandes.

Par statut : paramètre state

Par exemple, pour filtrer les demandes délivrées, un utilisateur effectuera la requête :

GET /feedbacks?state=DELIVERED

Autour d’un point : paramètre geo_near

Exemple :

GET /feedbacks?geo_near[radius]=1000&geo_near[geo_coordinates]=+44.8-0.5

retournera les demandes situées dans un rayon de 1000 mètres autour du point de latitude +44.8 et de longitude 0.5.

Dans un GeoHash : paramètre geo_hash

GeoHash est un système de géocodage […] basé sur une fonction de hachage qui subdivise la surface terrestre selon une grille hiérarchique. (Source : Wikipedia)

Pour plus d’informations sur GeoHash, voir :

Les demandes peuvent être filtrées par GeoHash de la façon suivante :

GET /feedbacks?geo_hash[]=ezzx&geo_hash[]=ezzz

retournera les demandes comprises dans les geo hash ezzx et ezzz.

Sur une période donnée : paramètres before et after

Exemple :

GET /feedbacks?after=2017-01-10T00:00:00+05:00&before=2017-02-22T23:59:59+05:00

retournera les demandes effectuées entre le 10/01/2017 et le 22/02/2017.

Les dates sont écrites au format : ISO 8601.

Par organisation

GET /feedbacks?organization={organization}

Commentaires

Les utilisateurs de la communauté peuvent commenter une demande :

POST /feedbacks/{feedback}/comments
{
    "text":"Mon commentaire"
}

Pour récupérer les commentaires d’une demande :

GET /feedbacks/{feedback}/comments

Soutiens

Un utilisateur peut soutenir une contribution en effectuant la requête suivante, sans paramètres :

POST /feedbacks/{feedback}/contributions

Pour récupérer tous les soutiens effectués sur une demande :

GET /feedbacks/{feedback}/contributions

Confidentialité des demandes

Cette page est en cours de rédaction. Cependant les données représentées dans les tableaux suivants sont correctes.

  Zone de responsabilité forcer en demande privée Zone de responsabilité forcer en demande publique Zone de responsabilité sans forcement
Demandes publiques Demandes privées Demandes publiques Demandes publiques
Demandes privées Demandes privées Demandes publiques Demandes privées
  Organisation publique Organisation privée
Demandes publiques Envoi possible par tous les utilisateurs Envoi uniquement par les membres d’une organisation
Demandes privées Envoi possible par tous les utilisateurs Envoi uniquement par les membres d’une organisation
  Organisation publique Organisation privée
Demandes publiques Demande visible par tous les utilisateurs Demande visible uniquement par l’émetteur, l’organisation réceptrice et ses membres
Demandes privées Demande visible uniquement par l’émetteur et l’organisation réceptrice Demande visible uniquement par l’émetteur et l’organisation réceptrice

Rapports

Chaque fois qu’une demande est délivrée (voir : Résumé du cycle de vie d’une demande), la demande est transmise à l’organisation concernée.

Un Administrateur récupère les demandes concernant son organisation avec :

GET /organizations/{organization}/reports

Et une demande donné est récupéré avec :

GET /reports/{report}

Cycle de vie d’une demande

Quand une nouvelle demande est générée pour une organisation, elle possède le statut NEW.

Le schéma ci-dessous montre l’évolution du statut d’une demande en fonction des actions qui sont effectuées sur cette demande.

_images/report_workflow.png

Un endpoint unique permet de changer le statut d’une demande :

PATCH /reports/{report}/state

Par exemple, pour passer du statut NEW au statut ACCEPTED, l’administrateur de l’organisation effectuera un « accept » en passant dans le corps de la requête :

{
    "transition":"accept"
}

Une demande ne peut être clôturée (statut CLOSED) que si :

  • Toutes les interventions associées à cette demande ont été clôturées ou refusées (voir ci-dessous le paragraphe reports-interventions).

Interventions

Une intervention est une action à réaliser associée à une demande et assignée à un membre de l’organisation.

Pour récupérer l’ensemble des interventions associées à une demande :

GET /reports/{report}/operations

Création et modification d’une intervention

Un administrateur crée une intervention sur une demande en effectuant la requête :

POST /operations
{
    "description":"Description de l'intervention",
    "name":"Nom de l'intervention",
    "report":"cb7118b5-a821-4cf2-9475-0c0d0efdb8d0"
}

Une intervention nouvellement créée possède le statut NEW.

Une ou plusieurs images peuvent être ajoutées à l’intervention :

POST /operations/{operation}/images
{
    "image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QIVDRUfvq7u+AAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAUSURBVAjXY3wrIcGABJgYUAGpfABZiwEnbOeFrwAAAABJRU5ErkJggg=="
}

La description d’une intervention peut être modifiée avec la requête :

PATCH /operations/{operation}
{
    "description":"Nouvelle description"
}

Assignation

Pour assigner une intervention à un membre de l’organisation, l’administrateur de l’organisation effectue la requête :

POST /operations/{operation}/assign
{
  "member":"{member}",
}

où {member} est l’identifiant du membre à qui est assignée l’intervention.

Intervention en cours et terminée

Une fois assignée, l’intervention peut-être passée « en cours » puis « terminée », soit par la personne à qui l’intervention a été assignée, soit par un administrateur de l’organisation.

Résumé du cycle de vie d’une intervention

_images/operation_workflow.png

Commentaires

Il est possible de commenter une intervention :

POST /operations/{operation}/comments
{
    "text":"Mon commentaire"
}

Pour récupérer tous les commentaires d’une intervention :

GET /operations/{operation}/comments

Logs d’une intervention

Un administrateur peut consulter l’historique d’une intervention avec :

GET /operations/{operation}/logs

Délégation des demanes

Un administrateur d’une organisation peut déléguer une demande à l’une des organisations partenaires.

Voir : Gestion des partenariats

Pour déléguer une demande, un administrateur de l’organisation effectue la requête :

POST /organizations/{organization}/delegates
{
  "report":"cb7118b5-a821-4cf2-9475-0c0d0efdb8d0",
  "organization":"a31d9ab7-9476-45f2-8cc7-033bf40bbcfa"
}

où {organization} est l’identifiant de l’organisation courante (dont le membre est administrateur), et a31d9ab7-9476-45f2-8cc7-033bf40bbcfa est l’identifiant de l’organisation à laquelle la demane est déléguée.

Cette demande est alors partagée entre l’organisation courante et l’organisation partenaire. Cette dernière pourra effectuer les mếmes actions que l’organisation délégante sur cette demande.

L’organisation partenaire peut elle-même déléguer la demande à l’un de ses partenaires et ainsi de suite.

Export des demandes

Un administrateur peut exporter toutes les demanes de son organisation au format Excel :

POST /organizations/{organization}/reports/exports

Une archive contenant le fichier Excel listant tous les demandes et les images associées à ces demandes est alors envoyé par email à l’administrateur authentifié.

Applications

Une application au cœur du service Keyclic permet de cloisonner les demandes suivant des domaines applicatifs. Cela se traduit par l’utilisation d’applications clientes ou de sites internet spécifiques à certains métiers.

Pour le client éponyme du service, l’application déclarée est « com.keyclic.app », toutes les applications clientes ou sites internet utilisant cette clé auront le même cloisonnement. (Ici : l’application iPhone Keyclic, l’application Android Keyclic et le site internet https://app.keyclic.com pour les navigateurs.)

Il existe d’autres applications déclarées dans le service Keyclic avec d’autres clés, notamment « Jaidemaville » disponible sur iPhone et Android.

Par exemple, depuis « Jaidemaville » (la clé est com.keyclic.city) :

  • il est impossible de lister les demandes dédiées à l’application Jaidemaville déclarée avec la clé « com.keyclic.app » et inversement,
  • il est impossible de lister les organisations affiliées à l’application Jaidemaville déclarée avec la clé « com.keyclic.app » et inversement.

Notifications

Le service Keyclic peut notifier des utilisateurs après que certaines actions sont réalisées.

Type des notifications émises suivant les actions

Action Cible Push Mur Email
Création de compte L’utilisateur    
Demande de changement de mot de passe L’utilisateur    
Commentaire d’une demande

L’émetteur de la demande

Les personnes qui ont commenté ou soutenu la demande

 
Demande créée Les administrateurs
Demande acceptée

L’émetteur de la demande

Les personnes qui ont commenté ou soutenu la demande

 
Demande clôturée

L’émetteur de la demande

Les personnes qui ont commenté ou soutenu la demande

 
Demande refusée

L’émetteur de la demande

Les personnes qui ont commenté ou soutenu la demande

 
Demande deléguée Les administrateurs
Ajout d’un document Les administrateurs  
Intervention assignée Le membre assigné à l’intervention
Intervention terminée L’administrateur ayant assigné l’intervention  
Rappel d’intervention

Les intervenants

L’émetteur de la demande

 
Commentaire d’une intervention

Le membre assigné à l’intervention L’administrateur ayant assigné l’intervention

Les members qui ont commenté l’intervention

 
Demande à évaluer L’évaluateur  

Lorsqu’une des cibles fait une action déclenchant une notification, il n’est lui-même pas notifié. Par exemple, si l’émetteur d’une demande commente sa demande, il ne recevra pas de notification lui disant qu’il a commenté sa propre demande.

Intégration

Webhooks

À la différence d’une API qui requiert des interrogations en continu, le service Keyclic propose des webhooks lorsque certains événements se produisent (voir la liste plus bas).

C’est un moyen simple et efficace d’appeler un service ou une application tierce afin de recevoir des notifications et de s’affranchir d’une vérification continuelle.

Les Webhooks peuvent avoir de nombreux usages, tels que :

  • collecter les demandes créés pour votre data-warehouse,
  • synchroniser les demandes et interventions avec votre SI (ex: GMAO, …),
  • envoyer des notifications.

Création et configuration de webhooks

Les webhooks peuvent être créés sur demande auprès de notre service.

Un webhook est composé de l’évènement pour lequel vous souhaitez être notifié et d’une URL à laquelle sera envoyée la notification.

Plusieurs webhooks peuvent être créés de façon illimitée pour chaque type d’évènements.

Types d’évènements

Évènement Description
reportCreated Création d’une nouvelle demande
reportStateChanged Changement de statut d’une demand
operationCreated Création d’une nouvelle intervention
operationStateChanged Changement de statut d’une intervention
operationRemoved Suppression d’une intervention

Réception d’une notification de webhook

Une notification de webhook est envoyée au format JSON dans le corps d’une requête HTTP POST sur l’url configurée dans le webhook. Elle est composée du nom de l’événement (event) et de la ressource concernée par l’événement (payload), la ressource pouvant varier en fonction de l’événement.

note : La ressource possède la même sérialisation que ce soit via une requête d’API ou lors d’une notification d’un webhook, il est donc possible de parcourir les ressources liées ou les propriétés embarquées grâce à la représentation HAL de notre API.

{
    "event": "reportCreated",
    "payload": {
        "type": "Report",
        "id": "b0e7e28f-5b91-4c73-875e-8f34aa03553a",
        "state": "NEW",
        "createdAt": "2018-02-27T10:00:00+02:00",
        "updatedAt": "2018-02-27T10:00:00+02:00",
        "_links": {
            "feedback": "...",
            "operations": "...",
            "organization": "...",
            "tracking": "...",
        },
        "_embedded": {
            "stateTransitions": "...",
            "tracking": "..",
        }
    }
}

Exemple de notification de webhook pouvant être reçue lors de la création d’une nouvelle demande (Exemple partiel).